如何编写 Greasemonkey 脚本

在本文中,记录了我入门 Greasemonkey 脚本编写的过程。

Greasemonkey 本质是向网页注入 JavaScript 代码。

Get hands dirty

最快速的入门方式就是直奔目标,寻找一个好玩的脚本分析之:文本选中复制,直奔代码。

元数据

脚本的开头是遗传固定写法。称为元数据。具体可参见《元数据 - 开发教程 - GM 开发手册》。几个有趣字段的含义:

代码入口

代码入口也是固定写法:

(function () {
	// 逻辑
})();

实现逻辑

规则

该脚本适配了众多网站,用统一的 Object 结构表示适配规则,每个网站为一个 Object。

有一个数组 websites 汇聚所有规则:

const websites = [
  website$s,
  //……
  website$3,
  website$2,
  website$1,
  website
];

鼠标事件监听

要破除限制,需要注册触发事件:

(function() {
  // 初始化
  const websiteConfig = initWebsite();
  initBaseEvent(websiteConfig);
  initBaseStyle();
  // 注册鼠标事件
  window.addEventListener(
    MOUSE_UP,
    (e) => {
      // 1. 获取用户选中的文本
      // 2. 如果文本为空,隐藏某些界面元素
      // 3. 如果文本不为空,那么调复制方法
      const handler = () => {
        const content = getSelectedText();
        if (isEmptyContent(content)) {
          instance.hide();
          return "";
        }
        instance.onCopy(content, e);
      };
      websiteConfig.delay 
	      ? setTimeout(handler, websiteConfig.delay) 
	      : handler();
    },
    // 事件的捕获或冒泡阶段是否触发事件处理函数
    websiteConfig.captureInstance
  );
})();

主要功能是监听鼠标的 "mouseup" 事件,当用户选中某些文本并释放鼠标按钮时,获取选中的文本并执行一些操作。

getSelectedText

该方法作用为获取选中文本。

该脚本对多种网站均做了专门适配。这说明,这些网站在文本选择上也实施了众多限制,需要专门适配。对应于众多网站适配对象的 getSelectedText 方法。

getSelectedText 方法也提供了兜底策略,如果网站没有声明专门适配,则走兜底策略:

const getSelectedText = () => {
  if (siteGetSelectedText)
    return siteGetSelectedText();
  if (window.getSelection)
    return (window.getSelection() || "").toString();
  if (document.getSelection)
    return (document.getSelection() || "").toString();
  if (document.selection)
    return document.selection.createRange().text;
  return "";
};

可见,是对 DOM API 的正常请求。

instance 单例

在脚本中,声明了一个 instance 单例,并且 hide、onCopy 都是访问它进行的。

该对象在 init 方法中,创建了一个新的 div 元素,文本为(复制),可见是一个复制按钮。

通过 show、hide 方法,实现该按钮的展示与隐藏。show 方法关联点击事件,实现基于点击位置相对位置弹出。对应的页面元素为 dom2

onCopy: 这个方法显示 dom 元素,并为其添加一个 click 事件监听器。当 dom 元素被点击时,复制 content 参数的内容,并隐藏 dom 元素。

对于 copy 方法,也是访问 DOM API 来实现的。

对 Greasemonkey API 的使用

前面大多都是访问的 DOM API,对页面元素进行操纵。

本节中寻找专门用到 Greasemonkey API 的场景。

GM_xmlhttpRequest

unsafeWindow

小结

通过简单浏览,大体了解 Greasemonkey 脚本的整体思路了。

API

Greasemonkey 精髓在于提供了一组强大的 API。具体可通过下面文档查阅:

网络资源

Tutorials - GreaseSpot Wiki》是一个资源聚合贴,提供许多资源:

Greasemonkey Manual

该手册分为两部分,用户指南和开发者指南。后者是我感兴趣的部分。

脚本托管站


本文作者:Maeiee

本文链接:如何编写 Greasemonkey 脚本

版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!


喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!